package com.woldier.filesystem.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import com.woldier.base.exception.DoopfsException;
import com.woldier.base.model.R;
import com.woldier.filesystem.model.dto.Client2FileDto;
import com.woldier.filesystem.model.po.Repository;
import com.woldier.filesystem.service.CheckService;
import com.woldier.filesystem.service.RepositoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static com.woldier.base.utils.UserHolder.getTokenUser;


@RestController
@RequestMapping("/share")
public class ShareCheckController {
    @Autowired
    CheckService checkService;
    @Autowired
    RepositoryService repositoryService;
    /**
     * 获取项目下的文件详细信息
     * @param owner 仓库所有者的用户名
     * @param repository 仓库名
     * @return
     */
    @RequestMapping("/list")
    public R list(@RequestParam String owner, @RequestParam String repository) throws DoopfsException {
        checkIsShared(owner, repository);
        return R.success(checkService.getAll(owner,repository));
    }




    /**
     *
     * 下载
     * 远端上传json 文件 ,在文件上传之前比对哪些文件不是最新版本需要进行进行更新
     */
    @PostMapping("/download")
    public R beforeUpdate(@RequestBody Client2FileDto data, @RequestParam String owner, @RequestParam String repository) throws DoopfsException {

        /**
         * 1.从数据库查看到 user ,name_repo 是username/repository 的
         * 2.若不为空表明他可以访问此仓库否则抛出异常
         * 3.访问此仓库
         */
        checkIsShared(owner,repository);

        return R.success(checkService.needDownload(owner,data.getData(),repository));
    }

    /**
     * 上传检查逻辑是,上传我们就以本地的为准,本地给服务端文件表
     *
     * 服务端对比文件是否是最新的是最新的不用上传,不是服务端要求客户端上传;
     *
     * 若本地不存在,服务器存在服务端就删除;
     *
     * 如果本地存在,服务器不存在,说明是本地新建,我们要求它上传.
     * @param data 本地上传的文件信息
     * @param repository 项目目录
     * @param owner
     * @return
     */
    @PostMapping("/update")
    public R checkNeedUpdate(@RequestBody Client2FileDto data, @RequestParam String owner, @RequestParam String repository) throws DoopfsException {

        checkIsShared(owner,repository);
        return R.success(checkService.checkUpdate(owner,data.getData(),repository));
    }
    /*---------------------------------------*/



    /**
     * 检查可以访问某共享仓库
     * @param owner
     * @param repository
     * @throws DoopfsException
     */
    private void checkIsShared(String owner, String repository) throws DoopfsException {
        String user = getTokenUser();
        /**
         * 1.从数据库查看到 user ,name_repo 是username/repository 的
         * 2.若不为空表明他可以访问此仓库否则抛出异常
         * 3.访问此仓库
         */
        LambdaQueryWrapper<Repository> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Repository::getUserName,user).eq(Repository::getNameRepo, owner +"/"+ repository);
        List<Repository> list = repositoryService.list(lambdaQueryWrapper);
        if (list.isEmpty()) DoopfsException.cast("本用户对仓库"+ owner +"/"+ repository +"无访问权");
    }


}
